<?php
/**
 * @see Zend_Form_Element_Multi
 */
require_once "Zend/Form/Element/Multi.php";

/**
 * Элемент формы, реализующий выбор структуры и заполнение данных при создании/редактировании материала
 * 
 * @category Phorm
 * @package JQuery_Form_Element
 * @name /Phorm/JQuery/Form/Element/StructuresResource.php
 * @copyright phorm.ru
 * @since 23.04.2012
 * @author vladimir@kachalov.net
 */

class Phorm_JQuery_Form_Element_StructuresResource extends Zend_Form_Element_Multi {
	
	/**
	 * Имя метода - помощника вида
	 * @var string
	 */
    public $helper = 'structuresResource';

   /**
	 * Объект переводчика
	 * @var Zend_Translate
	 */
	public $translate;
	
	/**
	 * Массив объектов формы элементов структуры
	 * @var array
	 */
	public $forms = array();
	
	/**
	 * Массив отрендеренных форм элементов структуры
	 * @var string
	 */
	public $renderforms = array();
	
	/**
	 * Определяем массив опций и дергаем родительский конструктор
	 *
	 * @param mixed $spec
	 * @param array $options
	 */
	
	public function __construct($spec, $options = null) {
		
		$this->translate = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('Translate');
		
		/**
		 * Получаем информацию о структуре или структурах
		 */
		
		if(isset($options['structures'])) {
			
			$options['structures'] = explode(',',$options['structures']);
		
			require_once 'Phorm/Structures.php';
			$StructuresModel = new Phorm_Structures();
			
			$structures = array();
			$multioptions = array();
			
			foreach ($options['structures'] as $key=>$structureid) {
				
				if($StructureInfo = $StructuresModel->getStructureFullInfo($structureid)) {
					
					$structures[$StructureInfo['structureid']] = $StructureInfo;
					
				} else {
					
					unset($options['structures'][$key]);
					
				}
				
				$multioptions[$StructureInfo['structureid']] = $StructureInfo['structurename'];
				$options['multioptions'] = $multioptions;
				
			}
			
			/**
			 * Определяем шаблон формы для элементов структур
			 */
			
			$form_tpl = new Phorm_Form(null,null,array('elements'=>$options['elements']));
			
			/**
			 * Создаем форму для каждой из структур
			 */
			
			require_once 'Phorm/Form.php';
			
			foreach ($structures as $structure) {
				
				$form = new Phorm_Form();
				
				$form -> removeDecorator('Form');
			    $form -> removeDecorator('DtDdWrapper');
				
				foreach ($structure['groups'] as $group) {
					
					$form -> setElementsBelongTo($spec . '[' . $structure['structureid'] . ']' . '[' . $group['groupid'] . ']');
					
					/**
					 * Добавляем элементы на форму
					 * @todo Добавить обязательность заполнения
					 */
					
					$elements = array(); // массив элементов для добавления в DisplayGroup
					
					foreach ($group['properties'] as $property) {
						
						/**
						 * Определяем тип используемого элемента
						 */
						
						$type = $property['propertytype'];
						$realtype = in_array($type,array('select','structure','dictionary')) && $property['ismultiple']=='yes' ? 'multiselect' : $type;
						
						if($element = clone $form_tpl->getElement($realtype)) {
							
							// Устанавливаем имя и заголовок элемента
							$element -> setLabel($property['propertyname'])
									 -> setName($property['propertyid']);
							
							// Допиливаем обычный селект		 
							if($type=='select' && !empty($property['propertyoptions'])) {
								$propertyoptions = array(); // ставим ключи массива опций в их значение
								foreach ($property['propertyoptions'] as $prop) $propertyoptions[$prop] = $prop;
								if($property['ismultiple']=='no') {
									$propertyoptions = array(null=>$this->translate->_('---Выберите---')) + $propertyoptions;
								}
								$element->setMultiOptions($propertyoptions);
							}
							
							// Допиливаем селект из другой структуры
							if($type=='structure' && $property['structureid']>0) {
								$propertyoptions = $StructuresModel->getStructureResourcesAsPairs($property['structureid']);
								if($property['ismultiple']=='no') {
									$propertyoptions = array(null=>$this->translate->_('---Выберите---')) + $propertyoptions;
								}
								$element->setMultiOptions($propertyoptions);
							}
							
							// Допиливаем селект из справочника
							if($type=='dictionary' && $property['dictionaryid']>0) {
								$DictionariesModel = new Phorm_Dictionaries();
								$propertyoptions = $DictionariesModel->getEntriesListAsPairs($property['dictionaryid']);
								if($property['ismultiple']=='no') {
									$propertyoptions = array(null=>$this->translate->_('---Выберите---')) + $propertyoptions;
								}
								$element->setMultiOptions($propertyoptions);
							}
									
							$form->addElement($element);
							$elements[] = $property['propertyid'];
							
						}
						
					}
					
					/**
					 * Если групп несколько, то добавляем DisplayGroup
					 * @todo Добавить в опции возможность задавать css-классы
					 */
					
					if(count($structure['groups'])>1) {
						$DisplayGroup = $form->addDisplayGroup($elements,'group-'.$group['groupid'],array('legend'=>$group['groupname']));
					}
					
					
				}
				
				$this->forms[$structure['structureid']] = $form;
				$this->renderforms[$structure['structureid']] = $form->render();
				
			}
			
			unset($options['elements']);
		
		}
		
		/**
		 * Инициализируем родительский конструктор
		 */
		
		parent::__construct($spec, $options);
		
	}
	
	
	/**
	 * Валидация элемента
	 *
	 * @param mixed $value
	 * @return boolean
	 */
	
	public function isValid($value) {
		
		$this->_messages = array();
        $this->_errors   = array();
		
		$this->setValue($value);
        $value = $this->getValue();
		
		$result = true;
		
		foreach ($value as $structureid=>$group) {
			$form = $this->forms[$structureid];
			if(!$form->isValid($value)) $result = false;
	        break;
        }
		
		return $result;
		
	}
	
	
	/**
     * Set element value
     *
     * @param  array $value
     * @return Zend_Form_Element
     */
	
    public function setValue($value) {
    	
    	if(!is_array($value)) return $this;
    	
        $this->_value = $value;
        
        foreach ($value as $structureid=>$group) {
	        $this->forms[$structureid]->setDefaults($value);
	        break;
        }
        
        return $this;
        
    }
	
}